import type { Linter } from 'eslint'
import globals from 'globals'
import pluginJs from '@eslint/js'
import tsEslint from 'typescript-eslint'
import pluginVue from 'eslint-plugin-vue'
import eslintConfigPrettier from 'eslint-config-prettier'
import vueEslintConfigPrettier from '@vue/eslint-config-prettier'

/**
 * eslint 配置
 * @see https://eslint.org/docs/latest/use/configure/configuration-files
 */
const eslintConfig = [
  // languageOptions：语言选项
  {
    languageOptions: {
      ecmaVersion: 'latest', // 支持的 ECMAScript 版本，默认值 latest
      sourceType: 'module', // JavaScript 源代码的类型，默认值 module
      globals: {
        ...globals.browser,
        // uni 相关全局变量
        uni: true,
        wx: true,
        WechatMiniprogram: true,
        getCurrentPages: true,
        getApp: true,
        UniApp: true,
        UniHelper: true,
        App: true,
        Page: true,
        Component: true,
        AnyObject: true
      } // 全局变量
    }
  },

  /** extends Start */
  // 使用预定义的 JavaScript 推荐配置
  pluginJs.configs.recommended,
  // eslint-plugin-vue
  ...pluginVue.configs['flat/strongly-recommended'], // eslint9.x 以上只能使用 flat 扁平化配置
  // typescript-eslint
  ...tsEslint.configs.recommended,
  // 兼容 eslint 与 prettier
  eslintConfigPrettier,
  vueEslintConfigPrettier,
  /** extends End */

  // typescript-eslint 解析器
  {
    files: ['**/*.vue', '**/*.ts'],
    languageOptions: {
      parserOptions: { parser: tsEslint.parser }
    },
    rules: {
      /* ts 类型检测配置 */
      '@typescript-eslint/no-explicit-any': 'off', // 关闭类型不能为any检测
      '@typescript-eslint/no-non-null-assertion': 'off', // 关闭静止非空断言检测
      '@typescript-eslint/no-empty-object-type': 'off' // 关闭空对象类型检测
    }
  },

  // 自定义配置
  {
    // files：一个 glob 模式数组，指示配置对象应用的文件
    files: ['**/*.{js,mjs,cjs,ts,vue}'],
    // rules：一个对象，包含规则名称和规则配置。指定 files 或 ignores 时，这些规则配置仅适用于匹配的文件。
    rules: {
      /* 其它类型监测配置 */
      'no-tabs': 'off', // 关闭注释带有tab符号检测
      'vue/multi-word-component-names': 'off' // 关闭vue多单词组件命名检测
    },
    // plugins：一个对象，包含插件名称和插件配置。指定 files 时，这些插件仅可用于匹配的文件。
    plugins: {}
  },
  // ignores: 一个 glob 模式数组，指示要忽略的文件
  {
    ignores: [
      'node_modules',
      'dist',
      'build',
      'coverage',
      'temp',
      'public',
      'static',
      'mock',
      'logs',
      '**/*.md',
      '**/*.(jpg|jpeg|png|webp|gif|svg)',
      '**/*.(css|scss|less)',
      '**/!(*.*)' // 指定不带扩展名的文件
    ]
  }
] as Linter.Config[]

export default eslintConfig
